package com.sumset.backbeans;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import com.sumset.daos.DaoCategoriaDenuncia;
import com.sumset.daos.DaoLlamada;
import com.sumset.daos.DaoUsuario;
import com.sumset.entidades.CategoriaDenuncia;
import com.sumset.entidades.Llamada;
import com.sumset.entidades.Usuario;
import com.sumset.variablesglobales.VariablesGLobales;

/**
 * Descripcion Clase: Clase donde se alojaran todas las funciones representativas de las paginas de las llamadas.
 * Responsabilidades: Atender y procesar todas las solicitudes de las paginas relacionadas con las llamadas.
 * Fecha Creacion: 13/02/2012
 * @author andres.
 * @author deivid.
 */
@SessionScoped
@ManagedBean
public class LlamadaBean {

	// Atributos de la categoria de dununcia.
	@EJB
	private DaoCategoriaDenuncia daoCategoriaDenuncia;
	private Integer categoriaSeleccionada;
	private CategoriaDenuncia categoriaDenuncia;

	// Atributos para mostrar los datos del usuario que este llamando.
	@EJB
	private DaoUsuario daoUsuario;
	private String nickDenunciante;
	private String nombre;
	private String correo;
	private String estado;
	private Usuario usuario;

	// Atributos para realizar la llamada.

	private String asunto;
	private Date fechaHoraSolicitud;
	private String estadoSeleccionado;
	private String tipoSeleccionado;
	private String descripcion;
	private Integer duracionAproximadaHoras;
	private Integer duracionAproximadaMinutos;

	@EJB
	private DaoLlamada daoLLamada;
	private Llamada llamada;
	private String mensajeAsignacion;
	private String mensajeLlamadas;

	// --Atributo para llamar la sesion del usuario.
	private UsuarioBean usuarioBean;

	/**
	 * Constructor por defecto de la clase llamadBean.
	 */
	public LlamadaBean() {

		super();
		categoriaSeleccionada = 1;
	}

	/**
	 * Proposito del Metodo: buscar el usuario que llame a denunciar.
	 * Responsabilidades: Mostrar los datos del usuario denunciante
	 * @return No aplica retorno.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No Aplica
	 * @exception No aplica*/
	public void buscarUsuario() throws Exception {

		try {
			usuario = daoUsuario.buscar(nickDenunciante);

			nombre = usuario.getNombre();
			correo = usuario.getCorreo();
			estado = usuario.getEstado();

		} catch (Exception e) {
			irPaginaError();
		}

	}
	
	/**
	 * Proposito del Metodo: listar las categorias.
	 * Responsabilidades: mostrar las categorias en un combobox
	 * @return una lista de items que se mostraran en el combobox.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<SelectItem> getCategorias() {
		List<CategoriaDenuncia> categorias = daoCategoriaDenuncia.listarDatos();
		List<SelectItem> item = new ArrayList<SelectItem>();

		// recorro las categorias para agregarlas a la lista de select item y
		// mostrarlas en el combobox
		for (CategoriaDenuncia cp : categorias) {

			SelectItem s = new SelectItem(cp.getId(), cp.getDescripcion());
			item.add(s);
		}
		return item;
	}
	/**
	 * Proposito del Metodo: buscar el codigo de la categoria seleccionada.
	 * Responsabilidades: es responsable de obtener el codigo de la categoria 
	 * seleccionada en el combobox.
	 * @return No aplica retorno.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param se captura el evento de la categoria seleccionada
	 * @exception No aplica*/
	public void asignarValorToCategoria(ValueChangeEvent event) {

		categoriaSeleccionada = (Integer) event.getNewValue();
	}

	/**
	 * Proposito del Metodo: ir a otra pagina.
	 * Responsabilidades: direccionarlo a la pagina que muestra un error
	 * en otra pagina 
	 * @return la pagina del error.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica.
	 * @exception No aplica*/
	public String irPaginaError() {

		return VariablesGLobales.RUTA_PAGINA_ERROR;
	}
	
	/**
	 * Proposito del Metodo: obtener una llamada.
	 * Responsabilidades: actualizar el estado de los campos de la 
	 * llamada que se obtenga 
	 * @return la pagina de la llamada.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param la llamada a capturar
	 * @exception No aplica*/

	public String obtenerLlamada(Llamada llam) {

		llamada = daoLLamada.buscar(llam.getId());
		return VariablesGLobales.REALIZAR_LLAMADA;
	}

	/**
	 * Proposito del Metodo: listar los usuarios dependiendo de su 
	 * categoria.
	 * Responsabilidades: mostrar en una tabla los usuarios de la categoria 
	 * seleccionada.
	 * @return una lista de usuarios que se mostraran en la tabla.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception si la lista no obtiene ningun dato*/
	public List<Usuario> getusuarioXCategoria() throws Exception {
		
		List<Usuario> lista = new ArrayList<Usuario>();
		
		try {
			categoriaDenuncia = daoCategoriaDenuncia
					.buscar(categoriaSeleccionada);

			lista = categoriaDenuncia.getListaUsuarios();

			for (int i = 0; i < lista.size(); i++) {

				Usuario us = lista.get(i);

				List<Llamada> listaLlamadas = us.getListaLlamadas();

				for (Llamada llamada : listaLlamadas) {

					if (llamada.getEstado().equals(
							VariablesGLobales.VARIABLE_ESTADO)) {

						lista.remove(us);

					}

				}
			}

		} catch (Exception e) {
			
			irPaginaError();
		}
		
		return lista;

	}

	/**
	 * Proposito del Metodo: registrar una llamada.
	 * Responsabilidades: registrar los datos de la llamada a un usuario denunciante.
	 * @return pagina donde se procede a realizar la denuncia
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public String crearLlamada() throws Exception {

		try {

			llamada.setEstado(estadoSeleccionado);
			llamada.setAsunto(asunto);
			llamada.setTipo(tipoSeleccionado);
			llamada.setDescripcion(descripcion);
			llamada.setFechaHoraSolicitud(fechaHoraSolicitud);
			llamada.setDuracionAproximada(duracionAproximadaHoras * 60
					+ duracionAproximadaMinutos);
			UsuarioBean usuario = (UsuarioBean) FacesContext
					.getCurrentInstance().getExternalContext().getSessionMap()
					.get(VariablesGLobales.VARIABLE_EJB_USUARIO);
			llamada.setUsuario(usuario.getUsuario());

			daoLLamada.actualizar(llamada);

			return VariablesGLobales.RUTA_PAGINA_DENUNCIAR;

		} catch (Exception e) {

			return VariablesGLobales.RUTA_PAGINA_ERROR;
		}

	}

	/**
	 * Proposito del Metodo: asignarle a un usuario una llamada.
	 * Responsabilidades: dependiendo de la disponibilidad del usuario,
	 * si este esta disponible, se le asignara una llamada.
	 * @return pagina para recibir la llamada.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param Nick del usuario a asignar.
	 * @exception No aplica*/
	public String asignarUsuario(String nickAsignado) {

		usuario = new Usuario();
		usuario = daoUsuario.buscar(nickAsignado);
		llamada = new Llamada();

		llamada.setUsuario(usuario);
		llamada.setEstado(VariablesGLobales.VARIABLE_ESTADO);
		llamada.setFechaHoraSolicitud(Calendar.getInstance().getTime());
		daoLLamada.insertar(llamada);
		mensajeAsignacion = VariablesGLobales.VARIABLE_MENSAJE_USUARIO
				+ usuario.getNickUser();
		return VariablesGLobales.RUTA_PAGINA_RECEPCION_LLAMADAS;

	}

	/**
	 * Proposito del Metodo: listar los estados de una llamada.
	 * Responsabilidades: ver el estado de cualquier llamada en la pagina
	 * @return una lista de items que se mostraran en el los estados de cada
	 * llamada.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<SelectItem> getListarEstados() {

		List<SelectItem> listaItems = new ArrayList<SelectItem>();
		SelectItem item1 = new SelectItem(VariablesGLobales.VALOR_ITEM1,
				VariablesGLobales.VALOR_ITEM1);
		SelectItem item2 = new SelectItem(VariablesGLobales.VALOR_ITEM2,
				VariablesGLobales.VALOR_ITEM2);
		SelectItem item3 = new SelectItem(VariablesGLobales.VALOR_ITEM3,
				VariablesGLobales.VALOR_ITEM3);
		listaItems.add(item1);
		listaItems.add(item2);
		listaItems.add(item3);

		return listaItems;

	}

	/**
	 * Proposito del Metodo: listar los tipos de las llamadas.
	 * Responsabilidades: mostrar los tipos de llamadas en un combobox
	 * @return una lista de items que se mostraran en el combobox.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<SelectItem> getListarTiposLlamada() {

		List<SelectItem> listaItems = new ArrayList<SelectItem>();
		SelectItem item1 = new SelectItem(VariablesGLobales.VALOR_TIPO_ITEM1,
				VariablesGLobales.VALOR_TIPO_ITEM1);
		SelectItem item2 = new SelectItem(VariablesGLobales.VALOR_TIPO_ITEM2,
				VariablesGLobales.VALOR_TIPO_ITEM2);
		listaItems.add(item1);
		listaItems.add(item2);

		return listaItems;

	}

	

	/**
	 * Proposito del Metodo: listar las horas.
	 * Responsabilidades: mostrar las horas en un combobox.
	 * @return una lista de items que seran las horas a mostrar.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<SelectItem> getListarHoras() {

		List<SelectItem> listaHoras = new ArrayList<SelectItem>();
		for (int i = 1; i < 24; i++) {

			SelectItem itemHoras = new SelectItem(i, i + "");
			listaHoras.add(itemHoras);
		}

		return listaHoras;

	}


	/**
	 * Proposito del Metodo: listar los minutos.
	 * Responsabilidades: mostrar los minutos en un combobox.
	 * @return una lista de items que seran los minutos a mostrar.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<SelectItem> getListarMinutos() {

		List<SelectItem> listaMinutos = new ArrayList<SelectItem>();
		for (int i = 1; i < 60; i++) {

			SelectItem itemMinutos = new SelectItem(i, i + "");
			listaMinutos.add(itemMinutos);
		}

		return listaMinutos;

	}

	/**
	 * Proposito del Metodo: listar las llamadas pendientes de un usuario.
	 * Responsabilidades: mostrar las llamadas que no halla atendido un usuario.
	 * @return una lista de llamadas pendientes.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<Llamada> getListarLlamadasPendientes() {

		setMensajeLlamadas(null);
		usuarioBean = (UsuarioBean) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap()
				.get(VariablesGLobales.VARIABLE_EJB_USUARIO);

		List<Llamada> listaLlamadasPendientes = new ArrayList<Llamada>();
		List<Llamada> listaLlamadas = usuarioBean.getUsuario()
				.getListaLlamadas();

		for (Llamada llamada : listaLlamadas) {

			if (llamada.getEstado().equals(VariablesGLobales.VARIABLE_ESTADO)) {

				listaLlamadasPendientes.add(llamada);

			}
		}

		if (listaLlamadasPendientes.isEmpty()) {

			setMensajeLlamadas(VariablesGLobales.MENSAJE_USUARIO_NO_TIENE_LLAMADAS_PENDIENTES);
		}

		return listaLlamadasPendientes;

	}

	//-----------------Metodos Getters and Setters--------------------------------------------
	
	public DaoCategoriaDenuncia getDaoCategoriaDenuncia() {
		return daoCategoriaDenuncia;
	}

	public void setDaoCategoriaDenuncia(
			DaoCategoriaDenuncia daoCategoriaDenuncia) {
		this.daoCategoriaDenuncia = daoCategoriaDenuncia;
	}

	public CategoriaDenuncia getCategoriaDenuncia() {
		return categoriaDenuncia;
	}

	public void setCategoriaDenuncia(CategoriaDenuncia categoriaDenuncia) {
		this.categoriaDenuncia = categoriaDenuncia;
	}

	public Integer getCategoriaSeleccionada() {
		return categoriaSeleccionada;
	}

	public void setCategoriaSeleccionada(Integer categoriaSeleccionada) {
		this.categoriaSeleccionada = categoriaSeleccionada;
	}

	public DaoUsuario getDaoUsuario() {
		return daoUsuario;
	}

	public void setDaoUsuario(DaoUsuario daoUsuario) {
		this.daoUsuario = daoUsuario;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getCorreo() {
		return correo;
	}

	public void setCorreo(String correo) {
		this.correo = correo;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getNickDenunciante() {
		return nickDenunciante;
	}

	public void setNickDenunciante(String nickDenunciante) {
		this.nickDenunciante = nickDenunciante;
	}

	public String getAsunto() {
		return asunto;
	}

	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}

	public Date getFechaHoraSolicitud() {
		return fechaHoraSolicitud;
	}

	public void setFechaHoraSolicitud(Date fechaHoraSolicitud) {
		this.fechaHoraSolicitud = fechaHoraSolicitud;
	}

	public String getEstadoSeleccionado() {
		return estadoSeleccionado;
	}

	public void setEstadoSeleccionado(String estadoSeleccionado) {
		this.estadoSeleccionado = estadoSeleccionado;
	}

	public String getTipoSeleccionado() {
		return tipoSeleccionado;
	}

	public void setTipoSeleccionado(String tipoSeleccionado) {
		this.tipoSeleccionado = tipoSeleccionado;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public DaoLlamada getDaoLLamada() {
		return daoLLamada;
	}

	public void setDaoLLamada(DaoLlamada daoLLamada) {
		this.daoLLamada = daoLLamada;
	}

	public Llamada getLlamada() {
		return llamada;
	}

	public void setLlamada(Llamada llamada) {
		this.llamada = llamada;
	}

	public Integer getDuracionAproximadaHoras() {
		return duracionAproximadaHoras;
	}

	public void setDuracionAproximadaHoras(Integer duracionAproximadaHoras) {
		this.duracionAproximadaHoras = duracionAproximadaHoras;
	}

	public Integer getDuracionAproximadaMinutos() {
		return duracionAproximadaMinutos;
	}

	public void setDuracionAproximadaMinutos(Integer duracionAproximadaMinutos) {
		this.duracionAproximadaMinutos = duracionAproximadaMinutos;
	}

	public String getMensajeAsignacion() {
		return mensajeAsignacion;
	}

	public void setMensajeAsignacion(String mensajeAsignacion) {
		this.mensajeAsignacion = mensajeAsignacion;
	}

	public UsuarioBean getUsuarioBean() {
		return usuarioBean;
	}

	public void setUsuarioBean(UsuarioBean usuarioBean) {
		this.usuarioBean = usuarioBean;
	}

	public String getMensajeLlamadas() {
		return mensajeLlamadas;
	}

	public void setMensajeLlamadas(String mensajeLlamadas) {
		this.mensajeLlamadas = mensajeLlamadas;
	}

}
